const fs = require('fs')
const fse = require('fs-extra')
const path = require('path')
const nodemailer = require("nodemailer")

module.exports = {
  // 上传图片（头像）
  uploadImg: (origin, file, uid) => {
    // 获取文件后缀
    const suffix = file.name.split('.').pop()
    // 文件路径：文件存放目录 + 用户id.文件后缀
    let filePath = path.join(__dirname, '../public/uploadImgs', `${uid}.${suffix}`)
    // 创建可读流
    const render = fs.createReadStream(file.path)
    // 文件目录
    const fileDir = path.join(__dirname, '../public/uploadImgs')
    // 判断文件目录是否存在,不存在，则新建
    if (!fs.existsSync(fileDir)) {
      fs.mkdirSync(fileDir, error => {
        if (error) throw error
      })
    }
    // 创建可写流
    const upStream = fs.createWriteStream(filePath)
    // 可读可写通过管道写入可写流
    render.pipe(upStream)
    return origin + '/uploadImgs/' + `${uid}.${suffix}`
  },
  // 上传文件
  upload: (bpath, file, name) => {
    // 获取文件后缀
    const suffix = file.name.split('.').pop()
    // 为了文件夹上传
    if (file.name.split('/').length > 1) {
      fse.mkdirsSync(path.join(__dirname, '../', bpath, file.name.split('/').slice(0, -1).join('/')))
    }
    // 文件路径：文件存放目录 + 用户 + 名称.后缀
    let filePath = path.join(__dirname, '..', bpath, name ? `${name}.${suffix}` : file.name)
    // 创建可读流
    const render = fs.createReadStream(file.path)
    // 默认会覆盖文件
    const upStream = fs.createWriteStream(filePath)
    // 可读可写通过管道写入可写流
    render.pipe(upStream)
    return {
      name: name ? `${name}.${suffix}` : file.name,
      path: name ? `${bpath}\\${name}.${suffix}` : bpath + '\\' + file.name,
      extension: suffix
    }
  },
  // 上传项目文件
  uploadPro: (bpath, file) => {
    // 文件路径：文件存放目录 + 用户id + code + 文件名称.后缀 /project/uid/code/file.zip
    let filePath = path.join(__dirname, '..', bpath, file.name)
    // 创建可读流
    const render = fs.createReadStream(file.path)
    // 文件目录
    const fileDir = path.join(__dirname, '..', bpath)
    // 判断文件目录是否存在,不存在，则新建
    fse.ensureDir(fileDir, error => {
      if (error) throw error
    })
    // 默认会覆盖文件
    const upStream = fs.createWriteStream(filePath)
    // 可读可写通过管道写入可写流
    render.pipe(upStream)
    return {
      name: file.name,
      path: `${bpath}\\${file.name}`
    }
  },
  // 发送邮件通知
  async sendEmail (name, email, content) {
    try {
      const user = '1737770335@qq.com'
      let transporter = nodemailer.createTransport({
        host: 'smtp.qq.com',
        secure: false,
        port: 587,
        auth: {
          user: user, //  发件人邮箱
          pass: 'darqwixztqxdbejd' //  从qq邮箱中获取授权码
        }
      })
      return await transporter.sendMail({
        from: `Yrainly <${user}>`, // sender address
        to: email, // list of receivers
        subject: name, // Subject line
        text: name, // plain text body
        html: `<b>${content}</b>` // html body
      })
    } catch (error) {
      throw error
    }
  }
}